package com.fish.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fish.common.result.ImportResult;
import com.fish.model.dto.*;
import com.fish.model.entity.User;
import com.fish.model.vo.LoginVO;
import com.fish.model.vo.UserInfoVO;
import com.fish.model.vo.UserVO;
import org.springframework.web.multipart.MultipartFile;

import jakarta.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * 用户服务接口
 */
public interface UserService {
    
    /**
     * 用户注册
     *
     * @param registerDTO 注册信息
     * @return 用户信息
     */
    UserVO register(UserRegisterDTO registerDTO);
    
    /**
     * 用户登录
     *
     * @param loginDTO 登录信息
     * @return 登录结果（包含Token和用户信息）
     */
    LoginVO login(UserLoginDTO loginDTO);
    
    /**
     * 根据用户ID获取用户信息
     *
     * @param userId 用户ID
     * @return 用户信息
     */
    UserVO getUserById(Long userId);
    
    /**
     * 根据用户名获取用户信息
     *
     * @param username 用户名
     * @return 用户信息
     */
    UserVO getUserByUsername(String username);
    
    /**
     * 获取用户完整信息（包含角色、权限、菜单）
     *
     * @param userId 用户ID
     * @return 用户完整信息
     */
    UserInfoVO getUserInfoWithPermissions(Long userId);
    
    /**
     * 分页查询用户列表
     *
     * @param current 当前页
     * @param size 每页大小
     * @param username 用户名（可选）
     * @return 用户分页列表
     */
    Page<UserVO> getUserList(Long current, Long size, String username);
    
    /**
     * 添加用户
     *
     * @param addDTO 用户信息
     * @return 用户信息
     */
    UserVO addUser(UserAddDTO addDTO);
    
    /**
     * 更新用户
     *
     * @param updateDTO 用户信息
     * @return 用户信息
     */
    UserVO updateUser(UserUpdateDTO updateDTO);
    
    /**
     * 删除用户
     *
     * @param userId 用户ID
     */
    void deleteUser(Long userId);
    
    /**
     * 搜索用户
     *
     * @param keyword 关键词（用户名或昵称）
     * @return 用户列表
     */
    List<UserVO> searchUsers(String keyword);
    
    /**
     * 邮箱注册
     *
     * @param registerDTO 注册信息
     * @return 登录结果（包含Token和用户信息）
     */
    LoginVO registerByEmail(EmailRegisterDTO registerDTO);
    
    /**
     * 邮箱验证码登录
     *
     * @param loginDTO 登录信息
     * @return 登录结果（包含Token和用户信息）
     */
    LoginVO loginByEmail(EmailLoginDTO loginDTO);
    
    /**
     * 更新邮箱
     *
     * @param updateDTO 更新信息
     */
    void updateEmail(UpdateEmailDTO updateDTO);
    
    /**
     * 检查邮箱是否已存在
     *
     * @param email 邮箱
     * @return true-已存在 false-不存在
     */
    boolean checkEmailExists(String email);

    /**
     * 导出用户列表到Excel
     *
     * @param response 响应对象
     * @param username 用户名（可选，用于筛选）
     */
    void exportUserList(HttpServletResponse response, String username);

    /**
     * 下载用户导入模板
     *
     * @param response 响应对象
     */
    void downloadTemplate(HttpServletResponse response);

    /**
     * 导入用户数据
     *
     * @param file Excel文件
     * @return 导入结果
     */
    ImportResult<User> importUserData(MultipartFile file);
}